package io.mft.datasource.db.accessor;

import cn.hutool.core.util.ReflectUtil;
import io.mft.datasource.db.accessor.bean.ContextValue;
import io.mft.datasource.db.accessor.bean.DbContextValue;
import io.mft.datasource.db.accessor.impl.DbDeleteAccessor;
import io.mft.datasource.db.accessor.impl.DbInsertAccessor;
import io.mft.datasource.db.accessor.impl.DbPageAccessor;
import io.mft.datasource.db.accessor.impl.DbQueryAccessor;
import io.mft.datasource.db.accessor.impl.DbUpdateAccessor;

/**
 * 数据访问管理器
 * 
 * @说明：TODO
 * @类型名称：DataAccessManager
 * @创建者: 胡常建
 * @创建时间: 2021年1月19日 下午6:29:29
 * @修改者: 胡常建
 * @修改时间: 2021年1月19日 下午6:29:29
 */
public class DataAccessManager {

	private static DataAccessManager instance = new DataAccessManager();
	
	private DataAccessManager() {
	}

	public static DataAccessManager getInstance() {
		return instance;
	}




	/**
	 * 数据库访问器
	 * @说明：TODO
	 * @类型名称：DbAccessors
	 * @创建者: 胡常建  
	 * @创建时间: 2021年1月29日 下午2:16:18
	 * @修改者: 胡常建  
	 * @修改时间: 2021年1月29日 下午2:16:18
	 */
	public class DbAccessors{
		public final DataAccessor<DbContextValue> dbPageAccessor=Accessors.DbPageAccessor.instance();
		public final DataAccessor<DbContextValue> dbInsertAccessor=Accessors.DbInsertAccessor.instance();
		public final DataAccessor<DbContextValue> dbUpdateAccessor=Accessors.DbUpdateAccessor.instance();
		public final DataAccessor<DbContextValue> dbQueryAccessor=Accessors.DbQueryAccessor.instance();
		public final DataAccessor<DbContextValue> dbDeleteAccessor=Accessors.DbDeleteAccessor.instance();
	}
	
	public final DbAccessors dbAccessors=new DbAccessors();
	/**
	 * 数据访问器
	 * @说明：TODO
	 * @类型名称：Accessors
	 * @创建者: 胡常建  
	 * @创建时间: 2021年1月27日 下午1:26:59
	 * @修改者: 胡常建  
	 * @修改时间: 2021年1月27日 下午1:26:59
	 */
	public enum Accessors{
		DbPageAccessor(DbPageAccessor.class),DbInsertAccessor(DbInsertAccessor.class),DbUpdateAccessor(DbUpdateAccessor.class),DbQueryAccessor(DbQueryAccessor.class),DbDeleteAccessor(DbDeleteAccessor.class);
		private DataAccessor<?> instance;
		private <T extends DataAccessor<?>> Accessors(Class<T> classType) {
			instance=ReflectUtil.newInstance(classType);
		}
		public <T extends ContextValue> DataAccessor<T> instance() {
			DataAccessor<T> accessor=(DataAccessor<T>)instance;
			return accessor;
		}
	}
}
